<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style></style>
  </head>
  <body>
    <div>
      闭包--概念 ·闭包：函数和其周围的状态（语法环境）的引用捆绑在一起形成闭包
      ====可以在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域的成员
      闭包的本质
      ====函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除，但是堆上的作用域成员因为被外部引用不能释放，因此内部函数依然可以访问外部函数的成员
    </div>
    <script>
      //函数作为返回值---下面的代码使用了闭包
      function makefn() {
        let msg = "Hello function";
        return function () {
          console.log(msg);
        };
      }
      const fn = makefn;
      fn();

      //函数作为返回值---下面的代码使用了闭包
      function once(fn) {
        let done = false;
        return function () {
          if (!done) {
            done = true;
            return fn.apply(this, arguments);
          }
        };
      }
      let pay = once(function (money) {
        console.log(`支付了${money}RMB`);
      });
    </script>
  </body>
</html>
